package DataStructure.ArrayLearning.SubList;

import java.util.ArrayList;
import java.util.List;

/**
 *  学习List中，sublist方法是一个视图方法，返回的是一个虚表
 *      在List源码中存在private类SubList
 *      调用sublist方法后，对源数据进行标记并传递到SubList构造方法中
 *      在SubList类中创建虚表，不返回任何对象
 *      实际上使用的仍然是源数据
 *      对切割后的list进行增删会影响到源数据
 *      并且SubList中会对modification进行检查
 *      如果不一致会报 并发修改异常
 *      ConcurrentModificationException
 *      所以当原list进行增删后，不能再调用切割后的list
 */
public class Demo {
    public static void main(String[] args) {

        ArrayList<String> arrayList = new ArrayList<>();
        arrayList.add("a");
        arrayList.add("b");
        arrayList.add("c");
        arrayList.add("d");
        System.out.println(arrayList);
        List<String> arrayList1 = arrayList.subList(0,2);
        System.out.println(arrayList1);

        arrayList.set(0,"aaa"); // set方法不会触发modCount++; 因此不会报错
        //arrayList.add("aaa"); // add方法触发modCount++; 因此会报错

        arrayList1.add(1,"gg");
        System.out.println(arrayList1);
        System.out.println(arrayList);
    }
}
